home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / FormatDisk.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  11KB  |  443 lines

  1.  /*
  2.     ***************************************************************************
  3.     *
  4.     * Datei:
  5.     *    RSysFormatDisk.c
  6.     *
  7.     * Inhalt:
  8.     *
  9.     *      --- Globale Routinen ---
  10.     *
  11.     *    void FormatDisk ( void );
  12.     *
  13.     *      --- Lokale  Routinen ---
  14.     *
  15.     *    static int OpenFormatDiskWindow ( void );
  16.     *    static void FindDevices ( void );
  17.     *    static void SelFormatProgram ( void );
  18.     *    static void startformat ( void );
  19.     *    static void update ( void );
  20.     *
  21.     * Bemerkungen:
  22.     *    Enthält die Schnittstelle zum AmigaOS-Format-Befehl.
  23.     *
  24.     * Erstellungsdatum:
  25.     *    19-Jul-93    Rolf Böhme
  26.     *
  27.     * Änderungen:
  28.     *    19-Jul-93    Rolf Böhme    Erstellung
  29.     *
  30.     ***************************************************************************
  31.   */
  32.  
  33. #include "RSys.h"
  34. #include "protos.h"
  35.  
  36. static LIST DevList;
  37.  
  38. static UBYTE fmtcmd[MAXWRITESIZE], parts[7][MAXSTRLEN] =
  39. {
  40.   "SYS:System/Format", "DF0:", "Empty", "OFS", "NOINTL", "NOICONS", ""
  41. };
  42.  
  43. static WINDOW *FormatDiskWnd = NULL;
  44. static GADGET *FormatDiskGList = NULL;
  45. static GADGET *FormatDiskGadgets[10];
  46. static UWORD FormatDiskLeft = 161;
  47. static UWORD FormatDiskTop = 49;
  48. static UWORD FormatDiskWidth = 297;
  49. static UWORD FormatDiskHeight = 116;
  50. static UBYTE FormatDiskWdt[100];    /*GMD */
  51.  
  52. static UBYTE *IconsGad0Labels[] =
  53. {
  54.   (UBYTE *) "Icons",
  55.   (UBYTE *) "No Icons",
  56.   NULL};
  57.  
  58. static UBYTE *FSCYGad0Labels[] =
  59. {
  60.   (UBYTE *) "OFS",
  61.   (UBYTE *) "FFS",
  62.   NULL};
  63.  
  64. static UBYTE *InterCYGad0Labels[] =
  65. {
  66.   (UBYTE *) "No international",
  67.   (UBYTE *) "International",
  68.   NULL};
  69.  
  70. static UWORD FormatDiskGTypes[] =
  71. {
  72.   STRING_KIND,
  73.   BUTTON_KIND,
  74.   LISTVIEW_KIND,
  75.   STRING_KIND,
  76.   CYCLE_KIND,
  77.   CYCLE_KIND,
  78.   CYCLE_KIND,
  79.   STRING_KIND,
  80.   BUTTON_KIND,
  81.   BUTTON_KIND
  82. };
  83.  
  84. static NEWGADGET FormatDiskNGad[] =
  85. {
  86.   68, 3, 145, 13, (UBYTE *) "Format", NULL, GD_FormatStrGad, PLACETEXT_LEFT, NULL, NULL,
  87.   216, 3, 73, 13, (UBYTE *) "Select", NULL, GD_SelFormatGad, PLACETEXT_IN, NULL, NULL,
  88.   8, 32, 73, 48, (UBYTE *) "Devices", NULL, GD_DevLV, PLACETEXT_ABOVE | NG_HIGHLABEL, NULL, NULL,
  89.   92, 32, 197, 13, (UBYTE *) "Disk label", NULL, GD_NameGad, PLACETEXT_ABOVE | NG_HIGHLABEL, NULL, NULL,
  90.   92, 50, 97, 13, NULL, NULL, GD_IconsGad, 0, NULL, NULL,
  91.   192, 50, 97, 13, NULL, NULL, GD_FSCYGad, 0, NULL, NULL,
  92.   92, 67, 197, 13, NULL, NULL, GD_InterCYGad, 0, NULL, NULL,
  93.   8, 85, 281, 13, NULL, NULL, GD_FmtStrGad, 0, NULL, NULL,
  94.   8, 100, 137, 13, (UBYTE *) "Format", NULL, GD_FormatGad, PLACETEXT_IN, NULL, NULL,
  95.   152, 100, 137, 13, (UBYTE *) "Quick", NULL, GD_QuickGad, PLACETEXT_IN, NULL, NULL
  96. };
  97.  
  98. static ULONG *FormatDiskGTags[] =
  99. {
  100.   (ULONG *) (GTST_String), (ULONG *) parts[0], (ULONG *) (GTST_MaxChars), (ULONG *) 256, (ULONG *) (TAG_DONE),
  101.   (ULONG *) (TAG_DONE),
  102.   (ULONG *) (GTLV_ShowSelected), (ULONG *) NULL, (ULONG *) GTLV_Labels, (ULONG *) & DevList, (ULONG *) GTLV_Selected, (ULONG *) 0, (ULONG *) GTLV_Top, (ULONG *) 0, (ULONG *) (TAG_DONE),
  103.   (ULONG *) (GTST_String), (ULONG *) parts[2], (ULONG *) (GTST_MaxChars), (ULONG *) 256, (ULONG *) (TAG_DONE),
  104.   (ULONG *) (GTCY_Labels), (ULONG *) & IconsGad0Labels[0], (ULONG *) (TAG_DONE),
  105. (ULONG *) (GTCY_Labels), (ULONG *) & FSCYGad0Labels[0], (ULONG *) (TAG_DONE),
  106.   (ULONG *) (GTCY_Labels), (ULONG *) & InterCYGad0Labels[0], (ULONG *) (TAG_DONE),
  107.   (ULONG *) (GTST_MaxChars), (ULONG *) 256, (ULONG *) GTST_String, (ULONG *) fmtcmd, (ULONG *) (TAG_DONE),
  108.   (ULONG *) (TAG_DONE),
  109.   (ULONG *) (TAG_DONE)
  110. };
  111.  
  112.  /*
  113.   * OpenFormatDiskWindow() öffnet ein Window mit
  114.   * Kontrollelementen zu Aufruf des FORMAT-Befehls
  115.   */
  116. static int
  117. OpenFormatDiskWindow (void)
  118. {
  119.   NEWGADGET ng;
  120.   GADGET *g;
  121.   UWORD lc, tc;
  122.   UWORD wleft = FormatDiskLeft, wtop = FormatDiskTop, ww, wh;
  123.   int gl[] =
  124.   {GD_FormatStrGad - GD_FormatStrGad,
  125.    GD_DevLV - GD_FormatStrGad,
  126.    GD_NameGad - GD_FormatStrGad,
  127.    GD_FmtStrGad - GD_FormatStrGad};
  128.  
  129.   DPOS;
  130.  
  131.   AdjustWindowDimensions (Scr, FormatDiskLeft, FormatDiskTop, FormatDiskWidth, FormatDiskHeight,
  132.               &wleft, &wtop, &ww, &wh);
  133.  
  134.   if (!(g = CreateContext (&FormatDiskGList)))
  135.     return (1L);
  136.  
  137.   for (lc = 0, tc = 0; lc < FormatDisk_CNT; lc++)
  138.     {
  139.       CopyMem ((char *) &FormatDiskNGad[lc], (char *) &ng, (long) sizeof (NEWGADGET));
  140.  
  141.       ng.ng_VisualInfo = VisualInfo;
  142.       ng.ng_TextAttr = Font;
  143.       ng.ng_LeftEdge = OffX + ComputeX (ng.ng_LeftEdge);
  144.       ng.ng_TopEdge = OffY + ComputeY (ng.ng_TopEdge);
  145.       ng.ng_Width = ComputeX (ng.ng_Width);
  146.       ng.ng_Height = ComputeY (ng.ng_Height);
  147.  
  148.       FormatDiskGadgets[lc] = g = CreateGadgetA ((ULONG) FormatDiskGTypes[lc], g, &ng, (TAGITEM *) & FormatDiskGTags[tc]);
  149.  
  150.       makelabelvisible (FormatDiskGadgets[lc]);
  151.  
  152.       while (FormatDiskGTags[tc])
  153.     tc += 2;
  154.  
  155.       tc++;
  156.  
  157.       if (NOT g)
  158.     return (2L);
  159.     }
  160.  
  161.   strcpy (FormatDiskWdt, get_vers (" - Format Disk"));    /*GMD */
  162.  
  163.   if (!(FormatDiskWnd = OpenWindowTags (NULL,
  164.                     WA_Left, wleft,
  165.                     WA_Top, wtop,
  166.                     WA_Width, ww,
  167.                     WA_Height, wh,
  168.                     WA_IDCMP, STRINGIDCMP |
  169.                     BUTTONIDCMP |
  170.                     LISTVIEWIDCMP |
  171.                     CYCLEIDCMP |
  172.                     IDCMP_CLOSEWINDOW |
  173.                     IDCMP_REFRESHWINDOW |
  174.                     IDCMP_VANILLAKEY,
  175.                     WA_Flags, WFLG_DRAGBAR |
  176.                     WFLG_DEPTHGADGET |
  177.                     WFLG_CLOSEGADGET |
  178.                     WFLG_SMART_REFRESH |
  179.                     WFLG_ACTIVATE |
  180.                     WFLG_RMBTRAP,
  181.                     WA_Title, FormatDiskWdt,
  182.                     WA_PubScreenFallBack, TRUE,
  183.                     WA_PubScreen, Scr,
  184.                     TAG_DONE)))
  185.     return (4L);
  186.  
  187.   RefreshRastPort (FormatDiskWnd, FormatDiskGadgets, gl, 4, FALSE, FormatDiskGList);
  188.  
  189.   return 0L;
  190. }
  191.  
  192.  /*
  193.   * FindDevices() sucht nach formatierbaren Devices im System
  194.   * und baut eine Liste mit deren Namen auf
  195.   */
  196. static void
  197. FindDevices (void)
  198. {
  199.   DOSLIST *DosList;
  200.   DEVICENODE *DevNode;
  201.   char dev[PATHPARTWIDTH], str[MAXFULLNAME];
  202.  
  203.   DosList = LockDosList (LDF_DEVICES | LDF_READ);
  204.  
  205.   while (DosList = NextDosEntry (DosList, LDF_DEVICES | LDF_READ))
  206.     {
  207.       DevNode = (DEVICENODE *) DosList;
  208.       if ((DevNode->dn_Startup > 1000) &&
  209.       (DevNode->dn_Task || DevNode->dn_Handler || DevNode->dn_SegList))
  210.     {
  211.       strncpy (str, B2CStr (dev, DevNode->dn_Name), MAXFULLNAME - 1);
  212.       strcat (str, ":");
  213.  
  214.       MakeDevEntry (&DevList, str);
  215.     }
  216.     }
  217.  
  218.   UnLockDosList (LDF_DEVICES | LDF_READ);
  219.  
  220.   return;
  221. }
  222.  
  223.  /*
  224.   * update() aktualisiert den Aufruf des Formatbefehls nach den
  225.   * Einstellungen des Kontrollfensters
  226.   */
  227. static void
  228. update (void)
  229. {
  230.   sprintf ((char *) fmtcmd, CMDFMT, parts[0], parts[1], parts[2], parts[3],
  231.        parts[4], parts[5], parts[6]);
  232.  
  233.   GT_SetGadgetAttrs (FormatDiskGadgets[GD_FmtStrGad - GD_FormatStrGad], FormatDiskWnd,
  234.              NULL,
  235.              GTST_String, fmtcmd,
  236.              TAG_DONE);
  237.  
  238.   return;
  239. }
  240.  
  241.  /*
  242.   * SelFormatProgram() bietet einen Filerequester an, mit dem
  243.   * ein alternativer Format-Befehl ausgeführt werden kann
  244.   */
  245. static void
  246. SelFormatProgram (void)
  247. {
  248.   if (GetFile (FormatDiskWnd, "SYS:System/", "Format", "#?", "Select Format program", "Select"))
  249.     if (exist ((char *) _fullpath))
  250.       {
  251.     strncpy ((char *) parts[0], (char *) _fullpath, MAXSTRLEN);
  252.     update ();
  253.       }
  254.     else
  255.       ErrorHandle ((char *) _fullpath, FILE_ERR, EXIST_FAIL, NO_KILL);
  256.  
  257.   return;
  258. }
  259.  
  260.  
  261.  /*
  262.   * startformat() führt den zusammengesetzten Format-Befehl mit
  263.   * der System()-Routine aus
  264.   */
  265. static void
  266. startformat (void)
  267. {
  268.   TAGITEM stags[5];
  269.   BPTR fileptr;
  270.  
  271.   if (fileptr = Open (autocon, MODE_OLDFILE))
  272.     {
  273.       stags[0].ti_Tag = SYS_Input;
  274.       stags[0].ti_Data = fileptr;
  275.       stags[1].ti_Tag = SYS_Output;
  276.       stags[1].ti_Data = NULL;
  277.       stags[2].ti_Tag = SYS_Asynch;
  278.       stags[2].ti_Data = FALSE;
  279.       stags[3].ti_Tag = SYS_UserShell;
  280.       stags[3].ti_Data = TRUE;
  281.       stags[4].ti_Tag = TAG_DONE;
  282.  
  283.       if (Question (FormatDiskWnd, (char *) fmtcmd, YES))
  284.     if (System (fmtcmd, stags) == -1L)
  285.       {
  286.         Close (fileptr);
  287.         ErrorHandle ((char *) fmtcmd, TASK_ERR, CREATE_FAIL, NO_KILL);
  288.       }
  289.     }
  290.  
  291.   return;
  292. }
  293.  
  294.  /*
  295.   * FormatDisk() bietet eine kleine Benutzeroberfläche an und
  296.   * verarbeitet die Eingaben, mit denen der Aufruf des
  297.   * Format-Befehls konfiguriert werden kann
  298.   */
  299. void
  300. FormatDisk (void)
  301. {
  302.   INTUIMESSAGE *message;
  303.   NODE *clicknode;
  304.   ULONG class, code;
  305.   APTR object;
  306.   char *buff;
  307.   int ID;
  308.  
  309.   DPOS;
  310.  
  311.   HandleHelp (MN_FormatDisk);
  312.  
  313.   Flags.quit_fd = 0;
  314.  
  315.   NewList (&DevList);
  316.  
  317.   FindDevices ();
  318.  
  319.   if (OpenASysWindow (OpenFormatDiskWindow, NO_KILL))
  320.     {
  321.       LockMainWindow (WIN_LOCK);
  322.  
  323.       update ();
  324.  
  325.       GT_SetGadgetAttrs (FormatDiskGadgets[GD_DevLV - GD_FormatStrGad], FormatDiskWnd,
  326.              NULL,
  327.              GTLV_Labels, &DevList,
  328.              TAG_DONE);
  329.       do
  330.     {
  331.       Wait (1L << FormatDiskWnd->UserPort->mp_SigBit);
  332.  
  333.       while ((message = (INTUIMESSAGE *)
  334.           GT_GetIMsg (FormatDiskWnd->UserPort)) != NULL)
  335.         {
  336.           object = message->IAddress;
  337.           class = message->Class;
  338.           code = message->Code;
  339.  
  340.           GT_ReplyIMsg (message);
  341.  
  342.           switch (class)
  343.         {
  344.         case IDCMP_GADGETUP:
  345.           ID = ((GADGET *) object)->GadgetID;
  346.  
  347.           HandleHelp ((enum RSysNumbers) ID);
  348.  
  349.           switch (ID)
  350.             {
  351.             case GD_FormatStrGad:
  352.               buff = gadgetbuff (FormatDiskGadgets[GD_FormatStrGad - GD_FormatStrGad]);
  353.               if (exist (buff))
  354.             {
  355.               strncpy ((char *) parts[0], buff, MAXSTRLEN);
  356.               update ();
  357.             }
  358.               else
  359.             ErrorHandle (buff, FILE_ERR, EXIST_FAIL, NO_KILL);
  360.               break;
  361.  
  362.             case GD_SelFormatGad:
  363.               SelFormatProgram ();
  364.               break;
  365.  
  366.             case GD_DevLV:
  367.               clicknode = GetNode (&DevList, code);
  368.               strncpy ((char *) parts[1], clicknode->ln_Name, MAXSTRLEN);
  369.               update ();
  370.               break;
  371.  
  372.             case GD_NameGad:
  373.               strncpy ((char *) parts[2], gadgetbuff (FormatDiskGadgets[GD_NameGad - GD_FormatStrGad]),
  374.                    MAXSTRLEN);
  375.               update ();
  376.               break;
  377.  
  378.             case GD_IconsGad:
  379.               if (code == 0)
  380.             parts[5][0] = STRINGEND;
  381.               else
  382.             strcpy ((char *) parts[5], "NOICONS");
  383.               update ();
  384.               break;
  385.  
  386.             case GD_FSCYGad:
  387.               strncpy ((char *) parts[3], (char *) FSCYGad0Labels[code], MAXSTRLEN);
  388.               update ();
  389.               break;
  390.  
  391.             case GD_InterCYGad:
  392.               strcpy ((char *) parts[4], (code == 0) ? "NOINTL" : "INTL");
  393.               update ();
  394.               break;
  395.  
  396.             case GD_FmtStrGad:
  397.               strncpy ((char *) fmtcmd,
  398.                    gadgetbuff (FormatDiskGadgets[GD_FmtStrGad - GD_FormatStrGad]),
  399.                    MAXWRITESIZE);
  400.               break;
  401.  
  402.             case GD_FormatGad:
  403.               parts[6][0] = STRINGEND;
  404.               update ();
  405.               startformat ();
  406.               break;
  407.  
  408.             case GD_QuickGad:
  409.               strcpy ((char *) parts[6], "QUICK");
  410.               update ();
  411.               startformat ();
  412.               break;
  413.             }
  414.  
  415.           break;
  416.  
  417.         case IDCMP_VANILLAKEY:
  418.           if (code == '\33')
  419.             Flags.quit_fd = 1;
  420.           break;
  421.  
  422.         case IDCMP_REFRESHWINDOW:
  423.           MakeWindowRefresh (FormatDiskWnd);
  424.           break;
  425.  
  426.         case IDCMP_CLOSEWINDOW:
  427.           Flags.quit_fd = 1;
  428.           break;
  429.         }
  430.         }
  431.     }
  432.       while (NOT (Flags.quit_fd));
  433.  
  434.       FreeRemember (DEVKEY, TRUE);
  435.  
  436.       CloseASysWindow (&FormatDiskWnd, &FormatDiskGList, NULL);
  437.  
  438.       LockMainWindow (WIN_UNLOCK);
  439.     }
  440.  
  441.   return;
  442. }
  443.